package pe.com.bbva.configuracion.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import pe.com.bbva.configuracion.bo.CorreoBO;
import pe.com.bbva.configuracion.domain.Correo;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.util.Constantes;
import pe.com.bbva.util.Util;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.domain.UsuarioSession;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("correoAction")
@Scope("prototype")
@Results({
	@Result(name="viewListCorreo",type="tiles", location="viewListCorreo"),
	@Result(name="viewFormCorreo",type="tiles", location="viewFormCorreo"),
	@Result(name="viewFormCorreoIncidencia",type="tiles", location="viewFormCorreoIncidencia"),
	@Result(name="listaCorreos",type="json",params={"root","grid"})
})
public class CorreoAction extends GenericAction {
	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private CorreoBO correoBO;
	private TablaBO tablaBO;

	private Long idCorreo;
	private Long idTabla;
	private String operacion;
	private String codigoAntiguo;
	private Correo correo;
	private Correo correoBuscar;
	private Tabla tabla;

	private List<Correo> listaCorreos;
	private List<Tabla> listaProcesos;

	public void cleanForm() {
		setIdCorreo(null);
		setCodigoAntiguo(null);
		setCorreo(null);
		setCorreoBuscar(null);
		setTabla(null);
	}
	
	@Action(value="initConfCorreos")
	public String init() {
		correo = new Correo();
		return "viewListCorreo";
	}
	
	@Action(value="findAllCorreo")
	public String findAll() {
		try {
			if (correoBuscar == null) {
				correoBuscar = new Correo();
			}
			setGrid(correoBO.findToGrid(correoBuscar,getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaCorreos";
	}
	
	@Action(value="findAllIncidencia")
	public String findAllIncidencia() {
		try {
			tabla = new Tabla();
			setGrid(tablaBO.findToGridIncidencia(tabla,getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaCorreos";
	}

	@Action(value="newCorreo")
	public String newForm() {
		String forward = "viewFormCorreo";
		String mensaje = "";
		try {
			List<Tabla> tipos = tablaBO.findTipoCorreo();
			List<Correo> correoTipo = correoBO.findCorreos(new Correo());
			if(correoTipo!=null && !correoTipo.isEmpty()){
				List<Tabla> tiposTmp = new ArrayList<Tabla>();
				for(Tabla tablaTmp: tipos){
					boolean encontrado = false;
					for(int i=0; i<correoTipo.size();i++){
						Correo correoTmp = correoTipo.get(i);
						if(correoTmp.getTipoCorreo() !=null && correoTmp.getTipoCorreo().equals(String.valueOf(tablaTmp.getValor()))){
							encontrado = true;
						}
						if(i==correoTipo.size()-1 && !encontrado){
							tiposTmp.add(tablaTmp);
						}
					}
				}
				if(tiposTmp.isEmpty()){
					mensaje = "Los correos ya han sido asignados a todos los tipos de correo";
					addActionError(mensaje);
					forward = "viewListCorreo";
				}else{
					setListaProcesos(tiposTmp);
				}
			}else{
				setListaProcesos(tipos);
			}
		} catch (BOException e) {
			mensaje = "No existen Procesos para el registro";
			addActionMessage(mensaje);
			forward = "viewListCorreo";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (DAOException e) {
			mensaje = "No existen Procesos para el registro";
			addActionMessage(mensaje);
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
			forward = "viewListCorreo";
		}
		return forward;
	}
	
	@Action(value="updateCorreo")
	public String updateForm() {
		try {
			setListaProcesos(tablaBO.findTipoCorreo());
			correo = correoBO.findById(idCorreo);
			codigoAntiguo = correo.getId().toString();
			listaProcesos = new ArrayList<Tabla>();
			Tabla busc = new Tabla();
			busc.setPadre(tablaBO.findById(Constantes.ID_TABLA_TIPO_CORREO));
			busc.setValor(Long.valueOf(correo.getTipoCorreo()));
			Tabla tipoCorreo = tablaBO.findTablas(busc).get(0);
			listaProcesos.add(tipoCorreo);
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormCorreo";
	}
	
	@Action(value="deleteCorreo")
	public String delete() {
		try {
			correoBO.deleteLog(Correo.class, idCorreo);
			addActionMessage("Eliminado Correctamente.");
		} catch (BOException e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewListCorreo";
	}
	
	@Action(value="saveCorreo")
	public String save() {
		String forward = "";
		String mensaje = "";
		if (idCorreo == null) {
			mensaje = "Registrado Correctamente";
		} else {
			mensaje = "Actualizado Correctamente";
		}
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(correo, usuarioSession);
			correoBO.save(correo);
			addActionMessage(mensaje);
			cleanForm();
			forward = "viewListCorreo";
		} catch (BOException e) {
			forward = "viewFormCorreo";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}

	@Action(value="loadCorreoIncidencia")
	public String loadFormIncidencia() {
		try {
			tabla = tablaBO.findTablaById(getIdTabla());
			correo = correoBO.findByIncidencia(tabla.getValor());
			if(correo == null){
				correo = new Correo();
				codigoAntiguo = correo.getId().toString();
			}else{
				String asuntoCompleto[] = correo.getAsunto().split(Pattern.quote("-"));
				correo.setAsunto(asuntoCompleto[asuntoCompleto.length-1].trim());
				correo.setContenido("");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormCorreoIncidencia";
	}
	
	@Action(value="saveIncidencia")
	public String saveIncidencia() {
		String forward = "";
		String mensaje = "";
		if (idCorreo == null) {
			mensaje = "Registrado Correctamente";
		} else {
			mensaje = "Actualizado Correctamente";
		}
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(correo, usuarioSession);
			Date today = new Date();
			String contenido = tabla.getCodigo() + "/n" + correo.getDescripcion();
			String asunto = Util.getFormatoFecha(today) + " " + Util.getFormatoHora(today) + " - " + correo.getAsunto();
			correo.setAsunto(asunto);
			correo.setIncidencia(String.valueOf(tabla.getValor()));
			correo.setContenido(contenido);
			correoBO.save(correo);
			addActionMessage(mensaje);
			cleanForm();
			forward = "viewListCorreo";
		} catch (BOException e) {
			forward = "viewFormCorreo";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}

	public CorreoBO getCorreoBO() {
		return correoBO;
	}

	public void setCorreoBO(CorreoBO correoBO) {
		this.correoBO = correoBO;
	}

	public Long getIdCorreo() {
		return idCorreo;
	}

	public void setIdCorreo(Long idCorreo) {
		this.idCorreo = idCorreo;
	}

	public String getCodigoAntiguo() {
		return codigoAntiguo;
	}

	public void setCodigoAntiguo(String codigoAntiguo) {
		this.codigoAntiguo = codigoAntiguo;
	}

	public Correo getCorreo() {
		return correo;
	}

	public void setCorreo(Correo correo) {
		this.correo = correo;
	}

	public Correo getCorreoBuscar() {
		return correoBuscar;
	}

	public void setCorreoBuscar(Correo correoBuscar) {
		this.correoBuscar = correoBuscar;
	}

	public List<Correo> getListaCorreos() {
		return listaCorreos;
	}

	public void setListaCorreos(List<Correo> listaCorreos) {
		this.listaCorreos = listaCorreos;
	}

	public void setTablaBO(TablaBO tablaBO) {
		this.tablaBO = tablaBO;
	}

	public TablaBO getTablaBO() {
		return tablaBO;
	}
	
	public Tabla getTabla() {
		return tabla;
	}

	public void setTabla(Tabla tabla) {
		this.tabla = tabla;
	}

	public void setListaProcesos(List<Tabla> listaProcesos) {
		this.listaProcesos = listaProcesos;
	}

	public List<Tabla> getListaProcesos() {
		return listaProcesos;
	}

	public void setIdTabla(Long idTabla) {
		this.idTabla = idTabla;
	}

	public Long getIdTabla() {
		return idTabla;
	}

	public void setOperacion(String operacion) {
		this.operacion = operacion;
	}

	public String getOperacion() {
		return operacion;
	}
}